#include <iostream>
#include <vector>

// C++14之后允许推导返回值
// auto func()
// {
//     return 1.1;
// }

// C++20之后参数都可以推
// auto func(auto a)
// {
//     return a;
// }

int main()
{
    // auto:自动类型推导关键字

#if 0
    // error：不允许二义性推导 
    // auto a = 10, b = 1.5;

    auto a = 10;
    auto b = 1.5;
#endif

#if 0
    int a = 10;
    int &b = a;
    auto c = b; // 推不出引用
    c++;
    std::cout << a << std::endl;
#endif

#if 0
    const int a = 10;

    auto c = a; // 推不出const
    c++;
    std::cout << a << std::endl;
#endif

#if 0
    int a[] = {1, 2, 3, 4, 5};
    auto b[10] = a; // 不能推导数组类型
#endif

#if 0
    std::vector<int> v;
    std::vector<auto> v2 = v; // 推不了模板
#endif

#if 0
    // C++14之后允许推导返回值
    auto a = func();
    std::cout << a << std::endl;
#endif

#if 0
    // C++20之后参数都可以推
    auto b = func(a);
    std::cout << b << std::endl;
#endif

#if 1
    std::vector<int> v = {1, 2, 3, 4, 5};
    // 基于范围的循环：base range for
    // 不用&会发生拷贝
    for (auto &value : v)
    {
        std::cout << value << std::endl;
    }
#endif

    return 0;
}